const Joi = require('joi');

// 创建活动数据验证规则
const createActivitySchema = Joi.object({
  title: Joi.string().min(1).max(200).required().messages({
    'string.min': '活动标题不能为空',
    'string.max': '活动标题不能超过200个字符',
    'any.required': '活动标题不能为空'
  }),
  subtitle: Joi.string().max(300).optional().allow('').messages({
    'string.max': '活动副标题不能超过300个字符'
  }),
  content: Joi.string().max(10000).optional().allow('').messages({
    'string.max': '活动内容不能超过10000个字符'
  }),
  startDate: Joi.date().iso().required().messages({
    'date.base': '开始日期格式不正确',
    'any.required': '开始日期不能为空'
  }),
  startTime: Joi.string().pattern(/^([0-1]?[0-9]|2[0-3]):[0-5][0-9]$/).required().messages({
    'string.pattern.base': '开始时间格式不正确，应为HH:mm格式',
    'any.required': '开始时间不能为空'
  }),
  endDate: Joi.date().iso().required().messages({
    'date.base': '结束日期格式不正确',
    'any.required': '结束日期不能为空'
  }),
  endTime: Joi.string().pattern(/^([0-1]?[0-9]|2[0-3]):[0-5][0-9]$/).required().messages({
    'string.pattern.base': '结束时间格式不正确，应为HH:mm格式',
    'any.required': '结束时间不能为空'
  }),
  maxParticipants: Joi.number().integer().min(1).max(10000).required().messages({
    'number.base': '最大参与人数必须是数字',
    'number.integer': '最大参与人数必须是整数',
    'number.min': '最大参与人数至少为1',
    'number.max': '最大参与人数不能超过10000',
    'any.required': '最大参与人数不能为空'
  }),
  contactPerson: Joi.string().max(100).optional().allow('').messages({
    'string.max': '负责人姓名不能超过100个字符'
  }),
  contactPhone: Joi.string().pattern(/^1[3-9]\d{9}$/).optional().allow('').messages({
    'string.pattern.base': '联系电话格式不正确'
  }),
  location: Joi.string().max(200).optional().allow('').messages({
    'string.max': '活动地点不能超过200个字符'
  }),
  organizer: Joi.string().max(100).optional().allow('').messages({
    'string.max': '主办方不能超过100个字符'
  }),
  registrationRequired: Joi.boolean().optional().default(true).messages({
    'boolean.base': '是否需要报名必须是布尔值'
  }),
  registrationDeadline: Joi.date().iso().optional().allow(null).messages({
    'date.base': '报名截止时间格式不正确'
  }),
  backgroundColor: Joi.string().pattern(/^#[0-9A-Fa-f]{6}$/).optional().messages({
    'string.pattern.base': '背景色格式不正确，应为十六进制颜色代码（如#ffffff）'
  }),
  createdBy: Joi.number().integer().min(1).required().messages({
    'number.base': '创建人ID必须是数字',
    'number.integer': '创建人ID必须是整数',
    'number.min': '创建人ID必须大于0',
    'any.required': '创建人ID不能为空'
  }),
  images: Joi.array().items(
    Joi.object({
      url: Joi.string().uri().required().messages({
        'string.uri': '图片URL格式不正确',
        'any.required': '图片URL不能为空'
      }),
      name: Joi.string().max(200).optional().allow('').messages({
        'string.max': '图片名称不能超过200个字符'
      }),
      size: Joi.number().integer().min(0).optional().messages({
        'number.base': '图片大小必须是数字',
        'number.integer': '图片大小必须是整数',
        'number.min': '图片大小不能为负数'
      }),
      type: Joi.string().max(50).optional().allow('').messages({
        'string.max': '图片类型不能超过50个字符'
      }),
      width: Joi.number().integer().min(1).optional().messages({
        'number.base': '图片宽度必须是数字',
        'number.integer': '图片宽度必须是整数',
        'number.min': '图片宽度至少为1'
      }),
      height: Joi.number().integer().min(1).optional().messages({
        'number.base': '图片高度必须是数字',
        'number.integer': '图片高度必须是整数',
        'number.min': '图片高度至少为1'
      }),
      sortOrder: Joi.number().integer().min(0).optional().default(0).messages({
        'number.base': '排序顺序必须是数字',
        'number.integer': '排序顺序必须是整数',
        'number.min': '排序顺序不能为负数'
      }),
      isCover: Joi.boolean().optional().default(false).messages({
        'boolean.base': '是否为封面图片必须是布尔值'
      })
    })
  ).max(5).optional().messages({
    'array.max': '最多只能上传5张图片'
  })
}).custom((value, helpers) => {
  // 自定义验证：结束时间必须晚于开始时间
  if (value.startDate && value.startTime && value.endDate && value.endTime) {
    const startDateTime = new Date(`${value.startDate}T${value.startTime}`);
    const endDateTime = new Date(`${value.endDate}T${value.endTime}`);
    
    if (endDateTime <= startDateTime) {
      return helpers.error('custom.endTime');
    }
  }
  
  // 自定义验证：报名截止时间不能晚于活动开始时间
  if (value.registrationDeadline && value.startDate && value.startTime) {
    const registrationDeadline = new Date(value.registrationDeadline);
    const startDateTime = new Date(`${value.startDate}T${value.startTime}`);
    
    if (registrationDeadline >= startDateTime) {
      return helpers.error('custom.registrationDeadline');
    }
  }
  
  return value;
}).messages({
  'custom.endTime': '结束时间必须晚于开始时间',
  'custom.registrationDeadline': '报名截止时间必须早于活动开始时间'
});

// 更新活动数据验证规则
const updateActivitySchema = Joi.object({
  title: Joi.string().min(1).max(200).optional().messages({
    'string.min': '活动标题不能为空',
    'string.max': '活动标题不能超过200个字符'
  }),
  subtitle: Joi.string().max(300).optional().allow('').messages({
    'string.max': '活动副标题不能超过300个字符'
  }),
  content: Joi.string().max(10000).optional().allow('').messages({
    'string.max': '活动内容不能超过10000个字符'
  }),
  startDate: Joi.date().iso().optional().messages({
    'date.base': '开始日期格式不正确'
  }),
  startTime: Joi.string().pattern(/^([0-1]?[0-9]|2[0-3]):[0-5][0-9]$/).optional().messages({
    'string.pattern.base': '开始时间格式不正确，应为HH:mm格式'
  }),
  endDate: Joi.date().iso().optional().messages({
    'date.base': '结束日期格式不正确'
  }),
  endTime: Joi.string().pattern(/^([0-1]?[0-9]|2[0-3]):[0-5][0-9]$/).optional().messages({
    'string.pattern.base': '结束时间格式不正确，应为HH:mm格式'
  }),
  maxParticipants: Joi.number().integer().min(1).max(10000).optional().messages({
    'number.base': '最大参与人数必须是数字',
    'number.integer': '最大参与人数必须是整数',
    'number.min': '最大参与人数至少为1',
    'number.max': '最大参与人数不能超过10000'
  }),
  contactPerson: Joi.string().max(100).optional().allow('').messages({
    'string.max': '负责人姓名不能超过100个字符'
  }),
  contactPhone: Joi.string().pattern(/^1[3-9]\d{9}$/).optional().allow('').messages({
    'string.pattern.base': '联系电话格式不正确'
  }),
  location: Joi.string().max(200).optional().allow('').messages({
    'string.max': '活动地点不能超过200个字符'
  }),
  organizer: Joi.string().max(100).optional().allow('').messages({
    'string.max': '主办方不能超过100个字符'
  }),
  registrationRequired: Joi.boolean().optional().messages({
    'boolean.base': '是否需要报名必须是布尔值'
  }),
  registrationDeadline: Joi.date().iso().optional().allow(null).messages({
    'date.base': '报名截止时间格式不正确'
  }),
  backgroundColor: Joi.string().pattern(/^#[0-9A-Fa-f]{6}$/).optional().messages({
    'string.pattern.base': '背景色格式不正确，应为十六进制颜色代码（如#ffffff）'
  }),
  images: Joi.array().items(
    Joi.object({
      url: Joi.string().uri().required().messages({
        'string.uri': '图片URL格式不正确',
        'any.required': '图片URL不能为空'
      }),
      name: Joi.string().max(200).optional().allow('').messages({
        'string.max': '图片名称不能超过200个字符'
      }),
      size: Joi.number().integer().min(0).optional().messages({
        'number.base': '图片大小必须是数字',
        'number.integer': '图片大小必须是整数',
        'number.min': '图片大小不能为负数'
      }),
      type: Joi.string().max(50).optional().allow('').messages({
        'string.max': '图片类型不能超过50个字符'
      }),
      width: Joi.number().integer().min(1).optional().messages({
        'number.base': '图片宽度必须是数字',
        'number.integer': '图片宽度必须是整数',
        'number.min': '图片宽度至少为1'
      }),
      height: Joi.number().integer().min(1).optional().messages({
        'number.base': '图片高度必须是数字',
        'number.integer': '图片高度必须是整数',
        'number.min': '图片高度至少为1'
      }),
      sortOrder: Joi.number().integer().min(0).optional().default(0).messages({
        'number.base': '排序顺序必须是数字',
        'number.integer': '排序顺序必须是整数',
        'number.min': '排序顺序不能为负数'
      }),
      isCover: Joi.boolean().optional().default(false).messages({
        'boolean.base': '是否为封面图片必须是布尔值'
      })
    })
  ).max(5).optional().messages({
    'array.max': '最多只能上传5张图片'
  })
}).custom((value, helpers) => {
  // 自定义验证：结束时间必须晚于开始时间
  if (value.startDate && value.startTime && value.endDate && value.endTime) {
    const startDateTime = new Date(`${value.startDate}T${value.startTime}`);
    const endDateTime = new Date(`${value.endDate}T${value.endTime}`);
    
    if (endDateTime <= startDateTime) {
      return helpers.error('custom.endTime');
    }
  }
  
  // 自定义验证：报名截止时间不能晚于活动开始时间
  if (value.registrationDeadline && value.startDate && value.startTime) {
    const registrationDeadline = new Date(value.registrationDeadline);
    const startDateTime = new Date(`${value.startDate}T${value.startTime}`);
    
    if (registrationDeadline >= startDateTime) {
      return helpers.error('custom.registrationDeadline');
    }
  }
  
  return value;
}).messages({
  'custom.endTime': '结束时间必须晚于开始时间',
  'custom.registrationDeadline': '报名截止时间必须早于活动开始时间'
});

// 活动ID验证规则
const activityIdSchema = Joi.object({
  id: Joi.number().integer().min(1).required().messages({
    'number.base': '活动ID必须是数字',
    'number.integer': '活动ID必须是整数',
    'number.min': '活动ID必须大于0',
    'any.required': '活动ID不能为空'
  })
});

// 活动状态验证规则
const activityStatusSchema = Joi.object({
  status: Joi.string().valid('upcoming', 'active', 'completed', 'cancelled').required().messages({
    'any.only': '活动状态只能是upcoming、active、completed或cancelled',
    'any.required': '活动状态不能为空'
  })
});

module.exports = {
  createActivitySchema,
  updateActivitySchema,
  activityIdSchema,
  activityStatusSchema
};
